package com.zzyl.serve.service.impl;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.List;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.*;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaweicloud.sdk.iotda.v5.IoTDAClient;
import com.huaweicloud.sdk.iotda.v5.model.ShowDeviceShadowRequest;
import com.huaweicloud.sdk.iotda.v5.model.ShowDeviceShadowResponse;
import com.zzyl.common.core.page.TableDataInfo;
import com.zzyl.common.exception.base.BaseException;
import com.zzyl.common.utils.DateUtils;
import com.zzyl.common.utils.UserThreadLocal;
import com.zzyl.framework.web.service.TokenService;
import com.zzyl.serve.domain.Elder;
import com.zzyl.serve.domain.FamilyMemberElder;
import com.zzyl.serve.dto.CheckInElderDto;
import com.zzyl.serve.dto.UserLoginRequestDto;
import com.zzyl.serve.mapper.ElderMapper;
import com.zzyl.serve.mapper.FamilyMemberElderMapper;
import com.zzyl.serve.service.IElderService;
import com.zzyl.serve.service.WechatService;
import com.zzyl.serve.vo.DeviceDataGraphVo;
import com.zzyl.serve.vo.CheckInElderVo;
import com.zzyl.serve.vo.FamilymemberVo;
import com.zzyl.serve.vo.LoginVo;
import com.zzyl.serve.vo.MemberVo;
import org.springframework.aop.scope.ScopedProxyUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zzyl.serve.mapper.FamilyMemberMapper;
import com.zzyl.serve.domain.FamilyMember;
import com.zzyl.serve.service.IFamilyMemberService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.Arrays;
import java.util.Map;

import static org.apache.poi.ss.usermodel.DateUtil.getLocalDateTime;

/**
 * 老人家属Service业务层处理
 * 
 * @author itheima
 * @date 2025-03-12
 */
@Service
public class FamilyMemberServiceImpl extends ServiceImpl<FamilyMemberMapper, FamilyMember> implements IFamilyMemberService
{
    @Autowired
    private FamilyMemberMapper familyMemberMapper;
    @Autowired
    private IElderService elderService;
    @Autowired
    private IoTDAClient client;
    /**
     * 查询老人家属
     * 
     * @param id 老人家属主键
     * @return 老人家属
     */
    @Override
    public FamilyMember selectFamilyMemberById(Long id)
    {
        return getById(id);
    }

    /**
     * 查询老人家属列表
     * 
     * @param familyMember 老人家属
     * @return 老人家属
     */
    @Override
    public List<FamilyMember> selectFamilyMemberList(FamilyMember familyMember)
    {
        return familyMemberMapper.selectFamilyMemberList(familyMember);
    }

    /**
     * 新增老人家属
     * 
     * @param familyMember 老人家属
     * @return 结果
     */
    @Override
    public int insertFamilyMember(FamilyMember familyMember)
    {
        return save(familyMember) ? 1 : 0;
    }

    /**
     * 修改老人家属
     * 
     * @param familyMember 老人家属
     * @return 结果
     */
    @Override
    public int updateFamilyMember(FamilyMember familyMember)
    {
        return updateById(familyMember) ? 1 : 0;
    }

    /**
     * 批量删除老人家属
     * 
     * @param ids 需要删除的老人家属主键
     * @return 结果
     */
    @Override
    public int deleteFamilyMemberByIds(Long[] ids)
    {
        return removeByIds(Arrays.asList(ids)) ? 1 : 0;
    }

    /**
     * 删除老人家属信息
     * 
     * @param id 老人家属主键
     * @return 结果
     */
    @Override
    public int deleteFamilyMemberById(Long id)
    {
        return removeById(id) ? 1 : 0;
    }


    @Autowired
    private WechatService webschatService;

    @Autowired
    private TokenService tokenService;

    /**
     *  小程序端 用户登录的逻辑处理
     * @param dto
     * @return
     */
    @Override
    public LoginVo login(UserLoginRequestDto dto) {


        //1.根据code调用微信api获取apenId
        String openid = webschatService.getOpenid(dto.getCode());

        //2.根据openId查询数据库获取用户信息family_member表
        FamilyMember familyMember = getOne(
                new LambdaQueryWrapper<FamilyMember>()
                        .eq(FamilyMember::getOpenId, openid)
        );

        //3.调用微信api获取用户绑定手机号
        String phone = webschatService.getPhone(dto.getPhoneCode());


        //4.判断用户信息是否存在，如果不存在，则新增family_member表
        //5.存在则 修改family_member表数据
        if(ObjectUtil.isNull(familyMember)){
            // 新用户


            familyMember = new FamilyMember();
            familyMember.setPhone(phone);
            familyMember.setOpenId(openid);

            // 设置初始随机名称
            familyMember.setName("花开富贵" + DateUtils.getTime());

            save(familyMember);

        }else {
            // 老用户
            familyMember.setPhone(phone);
            updateById(familyMember);
        }


        //6.将用户id存入token中，并返回数据给前端
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", familyMember.getId());
        claims.put("nickName", familyMember.getName());

        String token = tokenService.createToken(claims);
        LoginVo loginVo = new LoginVo();
        loginVo.setToken(token);
        loginVo.setNickName(familyMember.getName());
        return loginVo;
    }

/**
 * 按天统计查询指标数据
 */
    @Override
    public List<DeviceDataGraphVo> queryDeviceDataListByDay(String functionId, Long startTime, Long endTime, String iotId) {
       //开始时间转化
        LocalDateTime startLocalDateTime = getLocalDateTime(startTime);
        //结束时间转化
        LocalDateTime endLocalDateTime = getLocalDateTime(endTime);

        //初始化Vo
        List<DeviceDataGraphVo> dayInstancesList = DeviceDataGraphVo.getDayInstances(startLocalDateTime);
        List<DeviceDataGraphVo> list =  familyMemberMapper.queryDeviceDataListByDay(startLocalDateTime,endLocalDateTime,iotId,functionId);
        dayInstancesList.forEach(item -> {
            list.forEach(data -> {
                if (StrUtil.equals(item.getDateTime(), data.getDateTime())){
                    item.setDataValue(data.getDataValue());
                }
            });
        });
        return dayInstancesList;
    }



    @Override
    public List<MemberVo> selectPage(Long userId) {
        if(ObjectUtil.isNull(UserThreadLocal.get())){
            throw new BaseException("请先登录");
        }
        List<MemberVo> memberVos = familyMemberMapper.getPage(userId);
        return memberVos;
    }

    @Override
    public List<FamilymemberVo> my() {
        if(ObjectUtil.isNull(UserThreadLocal.get())){
            throw new BaseException("请先登录");
        }
        Long userId = UserThreadLocal.getUserId();
        List<FamilymemberVo> familymemberVos =  familyMemberMapper.selectmyFamilyMember(userId);
        return familymemberVos;
    }

    /**
     *
     * @param functionId
     * @param startTime
     * @param endTime
     * @param iotId
     * @return
     */
    @Override
    public List<DeviceDataGraphVo> queryDeviceDataListByWeek(String functionId, Long startTime, Long endTime, String iotId) {
        //开始时间转化
        LocalDateTime startLocalDateTime = getLocalDateTime(startTime);
        //结束时间转化
        LocalDateTime endLocalDateTime = getLocalDateTime(endTime);
        //初始化Vo
        List<DeviceDataGraphVo> weekInstancesList = DeviceDataGraphVo.getWeekInstances(startLocalDateTime);
        List<DeviceDataGraphVo> list =  familyMemberMapper.queryDeviceDataListByWeek(startLocalDateTime,endLocalDateTime,iotId,functionId);
        weekInstancesList.forEach(item -> {
            list.forEach(data -> {
                if (StrUtil.equals(item.getDateTime(), data.getDateTime())){
                    item.setDataValue(data.getDataValue());
                }
            });
        });
        return weekInstancesList;

    }

    public LocalDateTime getLocalDateTime(Long time) {
        // 将 long 转换为 Instant
        Instant instant = Instant.ofEpochMilli(time);
        // 将 Instant 转换为 LocalDateTime（使用系统默认时区）
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

    /**
     * 周统计查询指标数据
     */
    @Override
    public List<Map> queryServiceProperties(String iotId) {
        ShowDeviceShadowRequest showDeviceShadowRequest = new ShowDeviceShadowRequest();
        showDeviceShadowRequest.setDeviceId(iotId);
        ShowDeviceShadowResponse showDeviceShadowResponse = client.showDeviceShadow(showDeviceShadowRequest);
        JSONObject entries = JSONUtil.parseObj(showDeviceShadowResponse.getShadow().get(0).getReported().getProperties());
        LocalDateTime parse = LocalDateTimeUtil.parse(showDeviceShadowResponse.getShadow().get(0).getReported().getEventTime(), "yyyyMMdd'T'HHmmss'Z'");
        //日期时区转换
        LocalDateTime eventTime = parse.atZone(ZoneId.from(ZoneOffset.UTC))
                .withZoneSameInstant(ZoneId.of("Asia/Shanghai"))
                .toLocalDateTime();
        List<Map> list = new ArrayList<>();
        entries.forEach((k, v) -> {
            HashMap<String, Object> stringObjectHashMap = new HashMap<>();
            stringObjectHashMap.put("functionId", k);
            stringObjectHashMap.put("value", v);
            stringObjectHashMap.put("eventTime", eventTime);
            list.add(stringObjectHashMap);
        });

        return list;
    }

    @Override
    public void add(CheckInElderDto dto) {

    }
}
